前面一篇文帳講了一些關於docker的一些基本概念,這裡我想談談創建容器的方法:
docker run --name my_laravel_container -v /Users/liweide/laravel/pokemon:/var -p 8080:8080 laravel
docker run:
這是 Docker 的命令,用於運行一個容器。
-name my_laravel_container:
使用 --name 選項來為你的容器命名,這裡命名為 my_laravel_container。
v /Users/liweide/laravel/pokemon:/var:
這是一個 volume 映射。 -v 選項允許你將主機上的目錄(在這裡是 /Users/liweide/laravel/pokemon)映射到容器內的目錄(在這裡是 /var)。
volume為docker中一種數據持久化的方式。
為了不讓我們的容器刪除或創建新的容器後,所做的更變消失,docker提供了幾種方法:
這種方式比較像是創建一個共享目錄,然後讓所有綁定的容器及主機可以供想裡面的內容,所以如果容器存了任何資料是存到這個目錄裡。
建立 Volume
使用 docker volume create
命令來建立一個新的 Volume。
他會預設存在**/var/lib/docker/volumes/ 目錄下**
docker volume create my_volume
要將 Volume 綁定到容器,可以使用以下命令:
docker run -v my_volume:/path/in/container my_image
不需要的 Volume 可以使用 docker volume rm
進行刪除:
docker volume rm my_volume
Bind Mount 可以直接映射宿主機的文件或目錄到容器內,這個映射有點像是直接同步了你主機及容器對應的目錄,所以你容器做的任何修改他是直接反應到主機上。
docker run -v /host/path:/container/path my_image
Bind Mount 及 Volume指令在使用上的差異
所以他run指令的差別在於。你給他的目錄,如果他給的是主機的某個目錄他就是用bind Mount,如果給的是你創建volume的目錄的位置他就使用volume去做資料的持久化。
使用Bind Mount 及 Volume的不同時機比較
當你需要數據持久化並在多個容器間共享時,Volume 是最佳選擇。
如果需要直接訪問宿主機的文件系統,或者希望在開發中快速反映本地更改,則 Bind Mount 是更好的選項。
這裡其實還有Tmpfs Mount,但我沒使用過所以就不多說。
p 8000:8080:
這是一個端口映射。 -p 選項允許你將容器的端口映射到主機的端口。在這裡,主機的8000port會對應到容器的8080
為什麼容器需要自己的port號及ip?
我自己一開始在使用的一個疑問,後來以我自己的理解是,我覺得是為了達到隔離的效果。
隔離
這個隔離我覺得算是docker一個一個很重要的概念,就是容器跟容器之間不會互相影響,外部也不會直接訪問到容器。
隔離的目的:
透過隔離的機制當我們想要測試專案在創建各種容器的環境讓運行時,就可以確保不受外部因素干擾。
內部網路
性能:由於多了一層網路層隔離,可能會有些許的性能損失。
當外部請求要訪問此Web服務時,請求首先到達Docker宿主機,然後Docker需要透過其網路橋接將這些請求轉發到正確的容器。
但這個延遲老實說我還沒有足夠的經驗體會不到。
設定複雜性:可能需要設定端口映射和其他網路設定。
安全性:容器不再在其自己的網路命名空間中,這可能會導致安全風險。
比如:
如果有人攻擊你某個容器,整個主機跟容器都會受影響,但如果是在bridge網路連接下,你攻擊某一個容器,假設在沒使用mount等目錄共享的前提下,主機受到的影響可能比較沒這麼大。
不夠靈活:因為容器使用宿主機的端口,所以可能會出現端口衝突的問題。
p
這種端口映射指令。docker實在是非常多的細節可以研究,自己探究下去才發現水很深,我目前理解到這樣就花了不少時間,我自己覺得後續實務上真的有用到再進一步去研究吧。